package cn.edu.zufe.mjt.spinrg.web;

import cn.edu.zufe.mjt.spinrg.Autowired;
import cn.edu.zufe.mjt.spinrg.Component;
import cn.edu.zufe.mjt.spinrg.PostConstruct;
import cn.edu.zufe.mjt.spinrg.web.servlet.DispatcherServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.slf4j.bridge.SLF4JBridgeHandler;

import java.io.File;
import java.io.IOException;
import java.util.logging.LogManager;

/**
 * @author 蒙锦涛
 * @date 2025/5/8
 * @description 定义的 TomcatServer 类，用于启动 Tomcat 服务器并添加一个Servlet。
 */
@Component
public class TomcatServer {

    @Autowired
    private DispatcherServlet dispatcherServlet;

    @PostConstruct
    public void start() throws LifecycleException {

        // 日志管理器重置，移除所有日志处理器，并安装SLF4J日志处理器
        LogManager.getLogManager().reset();
        // 移除所有日志处理器
        SLF4JBridgeHandler.removeHandlersForRootLogger();
        // 安装SLF4J日志处理器
        SLF4JBridgeHandler.install();

        // 定义Tomcat服务器监听的端口
        int port = 8080;
        // 创建Tomcat服务器实例
        Tomcat tomcat = new Tomcat();
        // 设置Tomcat服务器的监听端口
        tomcat.setPort(port);
        // 获取Tomcat服务器的连接器信息，此处未使用返回值，可能是为了触发内部初始化
        tomcat.getConnector();

        // 定义上下文路径为空，表示默认上下文
        String contextPath = "";
        // 获取当前目录的绝对路径，作为Web应用的文档基础路径
        String docBase = new File(".").getAbsolutePath();
        // 向Tomcat服务器添加一个上下文，返回值是新添加的上下文实例
        Context context = tomcat.addContext(contextPath, docBase);

        // 向指定上下文路径添加一个Servlet，标识为"helloServlet"
        // 这个Servlet重写了doGet方法，响应所有GET请求
        tomcat.addServlet(contextPath, "helloServlet", dispatcherServlet);
        // 将"helloServlet"映射到上下文的根路径，拦截所有请求
        context.addServletMappingDecoded("/*", "helloServlet");

        // 启动Tomcat服务器
        tomcat.start();
        // 打印Tomcat服务器启动信息，包括监听的端口
        System.out.println("Tomcat started on port " + port);
    }
}
